<?php

use Illuminate\Http\Request;

/*
  |--------------------------------------------------------------------------
  | API Routes
  |--------------------------------------------------------------------------
  |
  | Here is where you can register API routes for your application. These
  | routes are loaded by the RouteServiceProvider within a group which
  | is assigned the "api" middleware group. Enjoy building your API!
  |
 */
Route::prefix('v1')->group(function () {
    Route::group(['namespace' => 'Common'], function () {
        /** 登陆登出接口 * */
        Route::post('/login', 'AuthorityController@login')->name('common.login');
        Route::post('/logout', 'AuthorityController@logout')->name('common.logout');
    });
});

Route::group(['prefix' => 'v1', 'middleware' => ['auth:api', 'log', 'acl']], function () {
    Route::group(['namespace' => 'Account'], function () {
        /** 用户组管理接口 * */
        Route::post('/usergroups', 'UserGroupController@addUsergroup')->name('usergroup.add');
        Route::delete('/usergroups/{id}', 'UserGroupController@deleteUsergroup')->name('usergroup.delete');
        Route::post('/usergroups/{id}', 'UserGroupController@editUsergroup')->name('usergroup.edit');
        Route::get('/usergroups/all', 'UserGroupController@getUsergroupListAll')->name('usergroup.list.all');
        Route::get('/usergroups/{id}', 'UserGroupController@getUsergroup')->name('usergroup.get');
        Route::get('/usergroups', 'UserGroupController@getUsergroupList')->name('usergroup.list');
        Route::get('/usergroups/{id}/permissions', 'UserGroupController@getUsergroupPermissionList')->name('usergroup.api.list');
        Route::post('/usergroups/{id}/permissions', 'UserGroupController@editUsergroupPermission')->name('usergroup.api.edit');
        Route::get('/usergroups/{id}/menus', 'UserGroupController@getUsergroupMenuList')->name('usergroup.menu.list');
        Route::post('/usergroups/{id}/menus', 'UserGroupController@editUsergroupMenu')->name('usergroup.menu.edit');
        //获取指定用户组下的用户，可分页，操作user_group_map_user表
        Route::get('/usergroups/{id}/users', 'UserGroupController@getUsergroupUserList')->name('usergroup.user.list');
        Route::get('/usergroups/{id}/menus/selected', 'UserGroupController@getUsergroupMenuSelected')->name('usergroup.menu.selected.all');
        //获取指定用户组下指定菜单的功能，不可分页，操作user_group_menu_actions表,返回值包含该action的数据域，在menu_action_scopes中
        Route::get('/usergroups/{id}/menus/{menu_id}/actions', 'UserGroupController@getUsergroupMenuActionAll')->name('usergroup.menu.action.all');
        Route::post('/usergroups/{id}/menus/{menu_id}/actions', 'UserGroupController@editUsergroupMenuAction')->name('usergroup.menu.action.edit');

        /** 用户管理接口 * */
        Route::post('/users', 'UserController@addUser')->name('user.add');
        Route::delete('/users/{id}', 'UserController@deleteUser')->name('user.delete');
        Route::post('/users/{id}', 'UserController@editUser')->name('user.edit');
        Route::get('/users/all', 'UserController@getUserListAll')->name('user.list.all');
        Route::get('/users/{id}/edit', 'UserController@getEditUser')->name('user.get.edit');
        Route::get('/users/{id}', 'UserController@getUser')->name('user.get');
        Route::get('/users', 'UserController@getUserList')->name('user.list');
        Route::get('/users/{id}/block', 'UserController@blockUser')->name('user.block');
        Route::get('/users/{id}/unblock', 'UserController@unblockUser')->name('user.unblock');
        Route::post('/users/{id}/password', 'UserController@editPassword')->name('user.password.edit');
        Route::post('/users/{id}/avatar', 'UserController@uploadAvatar')->name('user.avatar.add');
        Route::delete('/users/{id}/avatar', 'UserController@deleteAvatar')->name('user.avatar.delete');
        Route::get('/users/{id}/current', 'UserController@getCurrentUser')->name('user.get.current');
        Route::get('/users/{id}/my', 'UserController@getCurrentUserInfo')->name('user.my.get');
        Route::post('/users/{id}/my', 'UserController@editCurrentUserInfo')->name('user.my.edit');
        Route::get('/users/{id}/menus', 'UserController@getUserMenuList')->name('user.menu.list');
        Route::delete('/users/{id}/caches/clear', 'UserController@clearUserCache')->name('user.cache.clear');
        Route::delete('/users/{id}/tokens/clear', 'UserController@clearUserToken')->name('user.token.clear');
        Route::get('/users/{id}/password/reset', 'UserController@resetUserPassword')->name('user.password.reset');
        Route::get('/users/{id}/logs/login', 'UserController@getUserLoginLogList')->name('user.log.login.list');
        Route::get('/users/{id}/logs/operation', 'UserController@getUserOperationLogList')->name('user.log.operation.list');
        Route::get('/users/{id}/permissions', 'UserController@getUserPermission')->name('user.permission');
        //删除用户token接口
        Route::delete('/users/{id}/tokens', 'UserController@deleteToken')->name('user.token.delete');
        //重置全部用户缓存
        Route::get('/users/caches/reset', 'UserController@resetUserCache')->name('user.cache.reset');
        //删除用户头像，管理员使用
        Route::delete('/users/{id}/avatar/clear', 'UserController@clearUserAvatar')->name('user.avatar.clear');

        /** 权限分类管理接口 * */
        Route::post('/groups', 'UserPermissionCategoryController@addCategory')->name('group.add');
        Route::delete('/groups/{id}', 'UserPermissionCategoryController@deleteCategory')->name('group.delete');
        Route::post('/groups/{id}', 'UserPermissionCategoryController@editCategory')->name('group.edit');
        Route::get('/groups/all', 'UserPermissionCategoryController@getCategoryListAll')->name('group.list.all');
        Route::get('/groups/{id}', 'UserPermissionCategoryController@getCategory')->name('group.get');
        Route::get('/groups', 'UserPermissionCategoryController@getCategoryList')->name('group.list');
        Route::get('/groups/{id}/permissions', 'UserPermissionCategoryController@getCategoryPermissionList')->name('group.permission.list');

        /** 权限管理接口 * */
        Route::post('/permissions', 'UserPermissionController@addPermission')->name('permission.add');
        Route::delete('/permissions/{id}', 'UserPermissionController@deletePermission')->name('permission.delete');
        Route::post('/permissions/{id}', 'UserPermissionController@editPermission')->name('permission.edit');
        Route::get('/permissions/all', 'UserPermissionCategoryController@getPermissionListAll')->name('permission.list.all');
        Route::get('/permissions/{id}', 'UserPermissionController@getPermission')->name('permission.get');
        Route::get('/permissions', 'UserPermissionController@getPermissionList')->name('permission.list');
    });

    Route::group(['namespace' => 'Common'], function () {
        /** 部门管理接口 * */
        Route::post('/departments', 'DepartmentController@addDepartment')->name('department.add');
        Route::delete('/departments/{id}', 'DepartmentController@deleteDepartment')->name('department.delete');
        Route::post('/departments/{id}', 'DepartmentController@editDepartment')->name('department.edit');
        Route::get('/departments/all', 'DepartmentController@getDepartmentListAll')->name('department.list.all');
        Route::get('/departments/{id}', 'DepartmentController@getDepartment')->name('department.get');
        Route::get('/departments', 'DepartmentController@getDepartmentList')->name('department.list');
        Route::get('/departments/{id}/users', 'DepartmentController@getDepartmentUserList')->name('department.user.list');

        /** 上传附件接口 * */
        Route::post('/attachments', 'AttachmentController@addAttachment')->name('common.attachment.add');
        Route::get('/attachments/{filename}/download', 'AttachmentController@getAttachment')->name('common.attachment.get');
        Route::get('/attachments/{filename}/widget/download', 'AttachmentController@getWidgetAttachment')->name('common.attachment.widget.get');
        Route::post('/attachments/{filename}/delete', 'AttachmentController@deleteAttachment')->name('common.attachment.delete');
        Route::post('/attachments/common', 'AttachmentController@addCommonAttachment')->name('common.attachment.common.add');

        /** 菜单管理接口 * */
        Route::post('/menus', 'MenuController@addMenu')->name('menu.add');
        Route::delete('/menus/{id}', 'MenuController@deleteMenu')->name('menu.delete');
        Route::post('/menus/{id}', 'MenuController@editMenu')->name('menu.edit');
        Route::get('/menus/all', 'MenuController@getMenuListAll')->name('menu.list.all');
        Route::get('/menus/tree', 'MenuController@getMenuTree')->name('menu.list.tree');
        Route::get('/menus/{id}/children', 'MenuController@getMenuChildList')->name('menu.child.get');
        Route::get('/menus/{id}', 'MenuController@getMenu')->name('menu.get');
        Route::get('/menus', 'MenuController@getMenuList')->name('menu.list');
        //指定菜单下全部功能，无分页,返回全部字段
        Route::get('menus/{id}/actions', 'MenuController@getMenuActionAll')->name('menu.action.all');

        /** 菜单功能接口 * */
        //为指定菜单添加功能，menu_id，title，code必填，操作menu_actions表
        Route::post('/actions', 'MenuActionController@addAction')->name('menu.action.add');
        Route::delete('/actions/{id}', 'MenuActionController@deleteAction')->name('menu.action.delete');
        Route::post('/actions/{id}', 'MenuActionController@editAction')->name('menu.action.edit');
        //为指定的功能添加对应的接口，操作menu_action_map_permission表
        Route::post('/actions/{id}/permissions', 'MenuActionController@editActionPermission')->name('menu.action.permission.edit');
        Route::get('/actions/{id}/permissions', 'MenuActionController@getActionPermissionAll')->name('menu.action.permission.all');

        /** 日志接口 * */
        Route::get('/logs', 'OperationLogController@getLogList')->name('log.list');

        Route::get('/settings', 'SettingController@getSettingList')->name('setting.list');
        Route::post('/settings', 'SettingController@editSetting')->name('setting.edit');

        /** 数据域接口 * */
        Route::post('/scopes', 'DataScopeController@addScope')->name('scope.add');
        Route::delete('/scopes/{id}', 'DataScopeController@deleteScope')->name('scope.delete');
        Route::post('/scopes/{id}', 'DataScopeController@editScope')->name('scope.edit');
        Route::get('/scopes/all', 'DataScopeController@getScopeListAll')->name('scope.list.all');
        Route::get('/scopes/{id}', 'DataScopeController@getScope')->name('scope.get');
        Route::get('/scopes', 'DataScopeController@getScopeList')->name('scope.list');
        //指定数据域下用户，可分页，返回字段为【姓名，性别，部门，电话，职位，数据域，是否禁用】
        Route::get('/scopes/{id}/users', 'DataScopeController@getScopeUsers')->name('scope.user.list');
    });

    Route::group(['namespace' => 'Notice'], function () {
        /** 通知接口 * */
        //登录用户获取收到的通知消息 /notices/my?type=[system|sms]
        Route::get('/notices/my', 'NoticeController@getMyNoticeList')->name('notice.my.get');
        //发送系统通知,同时在system_notices 和 notice_records 中添加数据
        Route::post('/notices', 'NoticeController@addSystemNotice')->name('notice.add');
        //删除指定系统通知,同时删除system_notices 和 notice_records
        Route::delete('/notices/{id}', 'NoticeController@deleteSystemNotice')->name('notice.delete');
        //获取已发送系统通知列表,获取system_notices 中的数据,可分页
        Route::get('/notices', 'NoticeController@getSystemNoticeList')->name('notice.list');
        //获取发送失败的短信
        Route::get('/notices/errors', 'NoticeController@getNoticeErrorList')->name('notice.error.get');
        //获取全部尚未读取的通知
        Route::get('/notices/all', 'NoticeController@getNoticeListAll')->name('notice.list.all');
        //获取指定系统通知详情,获取system_notices 中指定的一行
        Route::get('/notices/{id}', 'NoticeController@getSystemNotice')->name('notice.get');
        //用户点击收到的通知消息修改状态为已读
        Route::get('/notices/{id}/read', 'NoticeController@readNotice')->name('notice.read');
        //批量清除(标记为已读)
        Route::post('/notices/clear', 'NoticeController@clearNotices')->name('notice.clear');

        //创建sms模板,在notice_templates 中添加数据
        Route::post('/notice/templates', 'NoticeTemplateController@addTemplate')->name('notice.template.add');
        //获取模板列表(全部.不加分页)
        Route::get('/notice/templates/all', 'NoticeTemplateController@getTemplateListAll')->name('notice.template.all');
        //获取模板列表
        Route::get('/notice/templates', 'NoticeTemplateController@getTemplateList')->name('notice.template.list');
        //删除sms指定模板
        Route::delete('/notice/templates/{id}', 'NoticeTemplateController@deleteTemplate')->name('notice.template.delete');
        //获取sms指定模板
        Route::get('/notice/templates/{id}', 'NoticeTemplateController@getTemplate')->name('notice.template.get');
        //编辑sms指定模板
        Route::post('/notice/templates/{id}', 'NoticeTemplateController@editTemplate')->name('notice.template.edit');

        /**
         * 通知组接口
         */
        //创建通知组，标题必填唯一，成员必填以数组形式存储
        Route::post('/notice/groups', 'NoticeGroupController@addGroup')->name('notice.group.add');
        //获取通知组列表(全部.不加分页)
        Route::get('/notice/groups/all', 'NoticeGroupController@getGroupListAll')->name('notice.group.all');
        //获取通知组列表
        Route::get('/notice/groups', 'NoticeGroupController@getGroupList')->name('notice.group.list');
        //获取通知组
        Route::get('/notice/groups/{id}', 'NoticeGroupController@getGroup')->name('notice.group.get');
        //编辑通知组
        Route::post('/notice/groups/{id}', 'NoticeGroupController@editGroup')->name('notice.group.edit');
    });

    Route::group(['namespace' => 'Basic'], function() {
        /**
         * 数据字典接口 
         * 注：主要用于前端各种下拉框选择使用，避免前端可供选项频繁变更
         */
        //添加字典，名称/编号必填唯一，创建者/更新者为登陆系统人员，数据域系统自动获得
        Route::post('/dictionaries', 'DictionaryController@addDictionary')->name('dictionary.add');
        //编辑字典，创建者/创建时间不可更改，创建人系统自动更改，编号不可更改
        Route::post('/dictionaries/{id}', 'DictionaryController@editDictionary')->name('dictionary.edit');
        //获取全部字典列表,限制条件：是否有效为有效状态，返回ID/名称，编号，无分页，根据 显示排序 字段 升序排序
        Route::get('/dictionaries/all', 'DictionaryController@getDictionaryListAll')->name('dictionary.list.all');
        //获取字典列表，可分页，默认显示顺序顺序排序，可根据名称及编号搜索，返回字段:ID/名称/编号/描述/显示顺序/是否有效/创建时间
        Route::get('/dictionaries', 'DictionaryController@getDictionaryList')->name('dictionary.list');
        //获取字典成员，限制条件：一级表及二级表状态都是有效状态的记录，用于前端不同地方下拉选择使用，返回对应成员的ID，名称,编号，可分页 接收字段为keyword(名称或编号)，用like进行匹配查找
        Route::get('/dictionaries/{code}/members', 'DictionaryController@getDictionaryMemberAll')->name('dictionary.member.get');
        //添加字典成员，字典ID/名称/编号必填，其中名称在同一字典ID中唯一(全局不需要唯一),编号全局唯一，父级ID需注意，父级不能是自己及自己的子集
        Route::post('/dictionary/members', 'DictionaryMemberController@addDictionaryMember')->name('dictionary.member.add');
        //编辑字典成员，创建者/创建时间不可更改，创建人系统自动更改
        Route::post('/dictionary/members/{id}', 'DictionaryMemberController@editDictionaryMember')->name('dictionary.member.edit');
        //获取字典成员列表，可分页，默认创建时间倒序排序，根据字典ID，编号及名称搜索，返回字段:ID/字典ID名称/父级ID名称/名称/编号/描述/显示顺序/是否有效/创建时间
        Route::get('/dictionary/members', 'DictionaryMemberController@getDictionaryMemberList')->name('dictionary.member.list');

        /**
         * 大区/省区接口
         * 注：主要用于前端下来框选择使用，选择大区，然后选择省区，二级联动
         */
        //添加大区，名称/编号必填唯一，创建者/更新者为登陆系统人员，数据域系统自动获得，如果选择了负责人，则负责人必须校验负责人是否为合法用户ID
        Route::post('/regions', 'RegionController@addRegion')->name('region.add');
        //编辑大区，创建者/创建时间不可更改，创建人系统自动更改，编辑时注意负责人的判断
        Route::post('/regions/{id}', 'RegionController@editRegion')->name('region.edit');
        //获取全部大区列表,限制条件：是否有效为有效状态，返回ID/名称，编号，无分页，根据 显示排序 字段 升序排序
        Route::get('/regions/all', 'RegionController@getRegionListAll')->name('region.list.all');
        //获取大区列表，可分页，默认显示顺序顺序排序，可根据名称及编号搜索，返回字段:ID/名称/编号/描述/显示顺序/是否有效/创建时间/负责人
        Route::get('/regions', 'RegionController@getRegionList')->name('region.list');
        //获取大区省区，一级及二级表全部，数形结构，限制条件：一级表及二级表状态都是有效状态的记录，用于前端不同地方下拉选择使用，返回对应省份的ID，名称,编号，不可分页
        Route::get('/regions/tree', 'RegionController@getRegionTree')->name('region.list.tree');
        //添加省区，大区ID/名称/编号必填，其中名称在同一大区ID中唯一(全局不需要唯一),编号全局唯一，如果选择了负责人，则负责人必须校验负责人是否为合法用户ID
        Route::post('/region/provinces', 'RegionProvinceController@addRegionProvince')->name('region.province.add');
        //编辑省区，创建者/创建时间不可更改，创建人系统自动更改，编辑时注意负责人的判断
        Route::post('/region/provinces/{id}', 'RegionProvinceController@editRegionProvince')->name('region.province.edit');
        //获取省区列表，可分页，默认创建时间倒序排序，根据大区ID，编号及名称搜索，返回字段:ID/大区ID名称/名称/编号/描述/显示顺序/是否有效/创建时间/负责人
        Route::get('/region/provinces', 'RegionProvinceController@getRegionProvinceList')->name('region.province.list');

        /**
         * 销售等级接口
         * 注：销售人员等级，用户创建使用
         */
        //添加销售等级,名称/简称必填，编号必填唯一，备注/上级销售非必填，注意子父级关系
        Route::post('/levels', 'SaleLevelController@addSaleLevel')->name('level.add');
        //编辑销售等级，注意层级关系
        Route::post('/levels/{id}', 'SaleLevelController@editSaleLevel')->name('level.edit');
        //获取销售等级树,只返回有效状态的树，返回编号，名称，简称。用于前端树形选择
        Route::get('/levels/tree', 'SaleLevelController@getSaleLevelTree')->name('level.tree');
        //获取销售等级列表树,返回所有状态所有字段
        Route::get('/levels/list/tree', 'SaleLevelController@getSaleLevelListTree')->name('level.list.tree');
    });

    Route::group(['namespace' => 'Customer'], function() {
        /**
         * 客户(医院/机构)接口
         * 注：医院/机构的信息，包括医院科室信息，客户编码规则 NC+0001，科室编码规则 NKS+00001
         */
        //添加客户，名称必填唯一，编号规则：NC+0001，负责人为用户表中ID，客户分类从数据字典中获取存ID，所属大区及省区存ID
        Route::post('/customers', 'CustomerController@addCustomer')->name('customer.add');
        //编辑客户，编号不可更改
        Route::post('/customers/{id}', 'CustomerController@editCustomer')->name('customer.edit');
        //获取客户及科室，接收字段为keyword(名称或编号)，用like进行匹配查找状态为有效的记录，返回对应的客户ID/名称及所有的科室ID/编号/名称，前端二级联动
        Route::get('/customers/tree', 'CustomerController@getCustomerTree')->name('customer.tree');
        //获取指定客户
        Route::get('/customers/{id}', 'CustomerController@getCustomer')->name('customer.get');
        //获取客户列表，可分页，默认创建时间倒序，可根据名称/编号/负责人搜索，返回字段：更新人/数据域不用返回
        Route::get('/customers', 'CustomerController@getCustomerList')->name('customer.list');
        //获取客户科室列表，返回对应科室列表信息，不可分页
        Route::get('/customers/{customer_id}/departments', 'CustomerController@getCustomerDepartmentList')->name('customer.department.list');
        //添加客户科室，所属医院ID/名称/所属大区/所属省区必填，编号规则：NKS+00001，其中名称在同一所属医院ID中唯一(全局不需要唯一),编号全局唯一
        Route::post('/customer/departments', 'CustomerDepartmentController@addCustomerDepartment')->name('customer.department.add');
        //编辑客户科室，编号不可更改
        Route::post('/customer/departments/{id}', 'CustomerDepartmentController@editCustomerDepartment')->name('customer.department.edit');
        //获取指定科室
        Route::get('/customer/departments/{id}', 'CustomerDepartmentController@getCustomerDepartment')->name('customer.department.get');

        /**
         * 医生接口
         * 注：医生信息，编号规则 NC+0001
         */
        //添加医生，姓名/所属医院/所属科室/手机号(不用正则校验)必填，所属销售为用户表中ID，客户类别从数据字典中获取存ID，所属大区及省区存ID
        Route::post('/doctors', 'DoctorController@addDoctor')->name('doctor.add');
        //编辑医生，编号不可更改，注意医院和科室是有关联的
        Route::post('/doctors/{id}', 'DoctorController@editDoctor')->name('doctor.edit');
        //获取医生及医院和科室，接收字段为keyword(姓名或编号)，用like进行匹配查找状态为有效的记录，返回对应的用户ID，名称以及对应的医院和科室（ID/编号/名称）
        Route::get('/doctors/tree', 'DoctorController@getDoctorTree')->name('doctor.tree');
        //获取指定医生
        Route::get('/doctors/{id}', 'DoctorController@getDoctor')->name('doctor.get');
        //获取客户列表，可分页，默认创建时间倒序，可根据姓名/编号/医院/科室/手机号/所属销售搜索，返回字段：更新人/数据域不用返回
        Route::get('/doctors', 'DoctorController@getDoctorList')->name('doctor.list');

        /**
         * 家系接口
         * 注：家系及成员信息，家系编号 NJ+000001, 成员编号 NP+年两位+月两位+日两位+0001
         */
        //添加家系，没有必填项，直接生成编号
        Route::post('/families', 'FamilyController@addFamily')->name('family.add');
        //编辑家系，编号不可更改
        Route::post('/families/{id}', 'FamilyController@editFamily')->name('family.edit');
        //获取家系列表，可分页，默认创建时间倒序，可根据家系编号/受检者编号/姓名/姓名修正/联系人/联系电话/医生/医院/创建人/录入时间搜索
        //返回字段：编号/备注/先证者编号/先证者姓名/创建日期/创建人/修改日期
        Route::get('/families', 'FamilyController@getFamilyList')->name('family.list');
        //获取指定家系成员全部，返回成员全部信息
        Route::get('/families/{family_id}/members', 'FamilyController@getFamilyMemberAll')->name('family.member.all');
        //添加家系成员，家系ID/姓名/编号/家系关系/是否患病必填，姓名修正 前端自动生成，根据家系关系和先证者命名(先证者:张三,关系:父,则生成姓名修正为 张三之父)
        Route::post('/family/members', 'FamilyMemberController@addFamilyMember')->name('family.member.add');
        //编辑家系成员，编号不可更改
        Route::post('/family/members/{id}', 'FamilyMemberController@editFamilyMember')->name('family.member.edit');
        //删除家系成员
        Route::delete('/family/members/{id}', 'FamilyMemberController@deleteFamilyMember')->name('family.member.delete');
        //获取家系成员列表，可分页，默认创建时间倒序，可根据家系编号/受检者编号/姓名/姓名修正/联系人/联系电话/医生/医院/创建人/录入时间/是否有效搜索
        Route::get('/family/members', 'FamilyMemberController@getFamilyMemberList')->name('family.member.list');
    });

    Route::group(['namespace' => 'Product'], function() {
        /**
         * 产品接口
         * 注：产品及组合产品信息，产品之间可打包组合
         */
        //添加产品，父级ID可选，如果选择需判断，检测方法，项目属性，测序平台，测序类型，结款方式来自数据字典
        Route::post('/products', 'ProductController@addProduct')->name('product.add');
        //编辑产品,如果从组合产品切换到非组合产品，对应的二级表应该删除，前端在更改状态的时候进行提醒
        Route::post('/products/{id}', 'ProductController@editProduct')->name('product.edit');
        //获取产品列表，只返回一级表信息，可分页，默认创建时间倒序，可根据编号/父级/检测周期/检测方法/项目定价/是否有效/是否组合项目/项目属性/备注/搜索
        Route::get('/products', 'ProductController@getProductList')->name('product.list');
        //获取产品树，一级表中根据父级ID及是否有效进行判断，生成树，与二级表无关，返回编号及名称
        Route::get('/products/tree', 'ProductController@getProductTree')->name('product.tree');
        //获取指定产品，包含一级及二级数据
        Route::get('/products/{id}', 'ProductController@getProduct')->name('product.get');
        //获取指定产品组合产品，返回组合产品信息
        Route::get('/products/{id}/packages', 'ProductController@getProductPackageAll')->name('product.package.all');
        //添加产品组合产品，只有 当前产品设置为 是否组合项目 1 时，可添加组合产品，一次添加一个
        Route::post('/product/packages', 'ProductPackageController@addProductPackage')->name('product.package.add');
        //删除产品组合产品
        Route::delete('/product/packages/{id}', 'ProductPackageController@deleteProductPackage')->name('product.package.delete');

        /**
         * 项目接口
         * 注：项目和合同有关，项目有产品信息
         */
        //添加项目，名称必填，编号必填唯一，合作机构/项目类型来自数据字典,负责人及销售来自用户表
        Route::post('/projects', 'ProjectController@addProject')->name('project.add');
        //编辑项目,编号不可编辑
        Route::post('/projects/{id}', 'ProjectController@editProject')->name('project.edit');
        //获取项目列表，只返回主表信息，可分页，默认创建时间倒序，可根据编号/名称/医生/项目类型/负责人/项目描述搜索
        Route::get('/projects', 'ProjectController@getProjectList')->name('project.list');
        //获取指定项目，包含主表数据
        Route::get('/projects/{id}', 'ProjectController@getProject')->name('project.get');
        //获取指定项目包含产品，不分页，返回全部
        Route::get('/projects/{id}/products', 'ProjectController@getProjectProductAll')->name('project.product.all');
        //添加项目包含产品，一次添加一个
        Route::post('/project/products', 'ProjectProductController@addProjectProduct')->name('project.product.add');
        //删除项目包含产品
        Route::delete('/project/products/{id}', 'ProjectProductController@deleteProjectProduct')->name('project.product.delete');
    });

    Route::group(['namespace' => 'Sample', 'prefix' => 'sample'], function() {
        /**
         * 样本接口
         * 注：销售首先添加家系，其次添加对应家系的样本，最后如果有订单的创建订单调用已经添加的家系及成员以及家系样本
         *     销售添加录入单->客服部进行审核->审核通过后可录入订单,否则修正到最终通过审核后录入订单（这块应该设计一套反馈的机制）
         *     客服部接收样本，首先创建接收单，然后扫描条形码进行接收，最终会有审核人进行审核，流入下一个环节
         * 发送单编号：NOKXJY + 年两位 + 月两位 + 日两位 + 序号四位
         * 接收单编号：NIKXJY + 年两位 + 月两位 + 日两位 + 序号四位
         * todo：每个销售看见自己创建的发送单，应该与数据域有关
         */
        //添加发送单，编号系统自动累加生成，类型type必须为0(系统自动填写，前端不需要传)，录入人系统登录人，录入时间前端传递，不可操作submitted_by/submit_time
        //可操作字段，checked_group/checked_by/inout_date/express_company(数据字典中取值)/express_number/project(项目管理中取值)/salesman(销售人员中取值)
        Route::post('/out/forms', 'InoutController@addOutForm')->name('sample.out.form.add');
        //编辑发送单,编号/类型不可编辑
        Route::post('/out/forms/{id}', 'InoutController@editOutForm')->name('sample.out.form.edit');
        //获取发送单列表，限制类型必须为0，只返回主表信息，可分页，默认创建时间倒序，可根据编号/受检者姓名/录入人/送检医生/送检医院/送检科室/样本用途/条形码/开单标记搜索
        Route::get('/out/forms', 'InoutController@getOutFormList')->name('sample.out.form.list');
        //获取指定发送单，包含主表数据
        Route::get('/out/forms/{id}', 'InoutController@getOutForm')->name('sample.out.form.get');
        //发送单提交审核
        Route::get('/out/forms/{id}/submit', 'InoutController@submitOutForm')->name('sample.out.form.submit');
        //发送单审核通过
        Route::post('/out/forms/{id}/approve', 'InoutController@approveOutForm')->name('sample.out.form.approve');
        //获取指定发送单包含的样本,可分页
        Route::get('/out/forms/{id}/samples', 'InoutController@getOutFormSampleList')->name('sample.out.form.sample');
        //添加样本，样本类型(从样本类型中选择)，运输方式/处理方式/样本用途（从数据字典选择），送检机构/送检科室/送检医生 从家系中带出来
        //需要操作sample_intent_products表，一个样本意向检测产品，一对多的关系
        Route::post('/samples', 'SampleController@addSample')->name('sample.add');
        //编辑样本
        Route::post('/samples/{id}', 'SampleController@editSample')->name('sample.edit');
        //获取指定样本
        Route::get('/samples/{id}', 'SampleController@getSample')->name('sample.get');
        //删除样本
        Route::delete('/samples/{id}', 'SampleController@deleteSample')->name('sample.delete');
        //获取样本明细列表,可分页，可根据订单编号/受检者/销售/家系号/条形码搜索
        Route::get('/samples', 'SampleController@getSampleList')->name('sample.list');
        //添加接收单，编号系统自动累加生成，类型type必须为1(系统自动填写，前端不需要传)，录入人系统登录人，录入时间前端传递，不可操作submitted_by/submit_time
        //不可操作，express_company/express_number/project/salesman
        Route::post('/in/forms', 'InoutController@addInForm')->name('sample.in.form.add');
        //编辑接收单
        Route::post('/in/forms/{id}', 'InoutController@editInForm')->name('sample.in.form.edit');
        //接收单提交审核
        Route::get('/in/forms/{id}/submit', 'InoutController@submitInForm')->name('sample.in.form.submit');
        //接收单审核通过
        Route::post('/in/forms/{id}/approve', 'InoutController@approveInForm')->name('sample.in.form.approve');
        //获取接收单列表,限制类型必须为1，只返回主表信息，可分页，默认创建时间倒序，可根据编号/受检者姓名/录入人/送检医生/送检医院/送检科室/样本用途/条形码/开单标记搜索
        Route::get('/in/forms', 'InoutController@getInFormList')->name('sample.in.form.list');
        //获取指定接收单，包含主表数据
        Route::get('/in/forms/{id}', 'InoutController@getInForm')->name('sample.in.form.get');
        //获取指定接收单包含的样本，可分页
        Route::get('/in/forms/{id}/samples', 'InoutController@getInFormSampleList')->name('sample.in.form.sample');
        //接收单样本接收(扫码枪扫码接收)，传递字段位barcodes，数组里面为每个样本的条形码
        Route::post('/in/forms/{id}/samples', 'InoutController@receiveSample')->name('sample.receive');

        /**
         * 样本类型接口
         * 注：样本的类型，不同类型有不同的工作流
         */
        //添加样本类型，名称必填，编号必填唯一
        Route::post('/types', 'TypeController@addType')->name('sample.type.add');
        //添加样本类型可选择的工作流，一次添加一个
        Route::post('/types/workflows', 'TypeWorkflowController@addTypeWorkflow')->name('sample.type.workflow.add');
        //编辑样本类型工作流
        Route::post('/types/workflows/{id}', 'TypeWorkflowController@editTypeWorkflow')->name('sample.type.workflow.edit');
        //删除样本类型工作流
        Route::delete('/types/workflows/{id}', 'TypeWorkflowController@deleteTypeWorkflow')->name('sample.type.workflow.delete');
        //编辑样本类型
        Route::post('/types/{id}', 'TypeController@editType')->name('sample.type.edit');
        //获取样本列表，只返回主表信息，可分页，默认创建时间倒序，可根据编号/名称搜索
        Route::get('/types', 'TypeController@getTypeList')->name('sample.type.list');
        //获取指定样本类型，包含主表数据
        Route::get('/types/{id}', 'TypeController@getType')->name('sample.type.get');
        //获取指定样本类型下的工作流，不分页，返回全部
        Route::get('/types/{id}/workflows', 'TypeController@getTypeAll')->name('sample.type.all');
    });

    Route::group(['namespace' => 'WorkFlow', 'prefix' => 'workflow'], function() {
        /**
         * 工作流人员组接口
         * 注：用于工作流各个环节人员信息配置
         */
        //添加人员组，名称必填，编号必填唯一，成员必填members，前端传回一个数组，数组中是对应成员ID
        Route::post('/groups', 'GroupController@addGroup')->name('workflow.group.add');
        //编辑人员组
        Route::post('/groups/{id}', 'GroupController@editGroup')->name('workflow.group.edit');
        //获取人员组列表，只返回人员组信息，可分页，默认创建时间倒序，可根据编号/名称搜索
        Route::get('/groups', 'GroupController@getGroupList')->name('workflow.group.list');
        //获取指定人员组
        Route::get('/groups/{id}', 'GroupController@getGroup')->name('workflow.group.get');
        //获取指定人员组成员，分页
        Route::get('/groups/{id}/users', 'GroupController@getGroupUserList')->name('workflow.group.user.list');

        /**
         * 工作流接口
         * 注：全部工作流管理
         */
        //添加工作流，名称必填，编号必填唯一
        Route::post('/workflows', 'WorkgroupController@addWorkgroup')->name('workflow.add');
        //编辑工作流
        Route::post('/workflows/{id}', 'WorkgroupController@editWorkgroup')->name('workflow.edit');
        //获取工作流列表，可分页，默认创建时间倒序，可根据编号/名称搜索
        Route::get('/workflows', 'WorkgroupController@getWorkgroupList')->name('workflow.list');
        //获取指定工作流
        Route::get('/workflows/{id}', 'WorkgroupController@getWorkgroup')->name('workflow.get');
    });
});

Route::prefix('v1')->group(function () {
    Route::post('/code', 'Common\ForgotPasswordController@sendCode')->name('common.code.send');
    Route::post('/reset', 'Common\ForgotPasswordController@resetPassword')->name('common.password.reset');
    Route::get('/export/sql', 'Common\ExportController@exportSql')->name('common.sql.export');
    Route::get('/export/online/{table}', 'Common\ExportController@exportOnline')->name('common.online.export');
});

